package com.ywk.base.javaBase.paramTransfer;

/**
 *Java中的参数传递：将一个参数传入一个方法时,本质上是将对象的地址以值的方式传递到形参中
 *
 * @Author zbh
 * @Date 2023/3/29
 */
public class ParamTransfer {

    /**
     * 引用类型
     * @param dog
     */
    private static void fun1(Dog dog) {
        dog.setName("AA");
    }

    private static void fun2(Dog dog) {
        dog = new Dog("BB");
    }

    /**
     * 基本数据类型
     * @param i
     */
    private static void fun3(int i) {
        i = 10;
    }

    /**
     * 包装类型
     * @param b
     */
    private static void fun4(Boolean b) {
        b = true;
    }

    public static void main(String[] args) {
        //在方法中改变对象的字段值会改变原对象该字段值，因为引用的是同一个对象。
        Dog dog = new Dog("A");
        fun1(dog);
        System.out.println(dog.getName()+":"+dog.getObjectAddress());//AA

        System.out.println("===============================");

        //但是在方法中将指针引用其它对象，那么此时方法里和方法外的两个指针指向了不同的对象，此时指针改变其所指向对象的内容对另一个指针所指向的对象没有影响。
        Dog dog1 = new Dog("B");
        System.out.println(dog1.getName()+":"+dog1.getObjectAddress());
        fun2(dog1);
        System.out.println(dog1.getName()+":"+dog1.getObjectAddress());

        System.out.println("===============================");
        int i=5;
        fun3(i);
        System.out.println(i);

        Boolean b = false;
        fun4(b);
        System.out.println(b);

    }



}

class Dog{
    String name;

    Dog(String name) {
        this.name = name;
    }

    String getName() {
        return this.name;
    }

    void setName(String name) {
        this.name = name;
    }

    String getObjectAddress() {
        return super.toString();
    }
}